home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 October: Mac OS SDK / Dev.CD Oct 97 SDK1.toast / Development Kits (Disc 1) / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAEClose.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  3.9 KB  |  160 lines  |  [TEXT/CWIE]

  1. // SVAEClose.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAEClose.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  11. #include "SVEditFile.h"            // for DoClose()
  12.  
  13.  
  14. #pragma segment AppleEvent
  15.  
  16.  
  17. pascal OSErr DoCloseWindow(const AppleEvent        *theAppleEvent,
  18.                                 AppleEvent        *reply,
  19.                                 long            handlerRefCon)
  20. {
  21. #pragma unused (reply, handlerRefCon)
  22.  
  23.     AEDesc            directObj = {typeNull, NULL};
  24.     DescType         saveOpt;
  25.     Size              actualSize;
  26.     DescType          returnedType;
  27.     WindowToken        aWindowToken;
  28.     OSErr             err;
  29.     
  30.         // pick up the direct object, which is the object (window) to close or a list of windows
  31.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  32.                 
  33.         // pick up optional save param, if any
  34.     saveOpt = kAEAsk;     // the default
  35.     (void)AEGetParamPtr(theAppleEvent, keyAESaveOptions, typeEnumerated, &returnedType,
  36.                                                     (Ptr)&saveOpt, sizeof(saveOpt), &actualSize);
  37.                                                      
  38.     err = GotRequiredParams(theAppleEvent);
  39.     if (noErr != err) goto done;
  40.     
  41.     if (typeNull != directObj.descriptorType)
  42.         err = CloseDesc(&directObj, saveOpt);
  43.     else if (FrontWindow())                        // Default to front window if
  44.     {                                            // no direct object.
  45.         aWindowToken.tokenWindow = FrontWindow();
  46.         err = CloseWindowToken(&aWindowToken, saveOpt);
  47.     }
  48.     else
  49.         err = errAENoSuchObject;
  50.  
  51. done:
  52.     if (directObj.dataHandle) 
  53.         AEDisposeDesc(&directObj);
  54.             
  55.     return(err);
  56. }    // DoCloseWindow
  57.  
  58.  
  59. OSErr    CloseWindowToken(WindowToken* theToken, DescType saveOpt)
  60. {
  61.     WindowPtr        aWindow;
  62.     DPtr            docPtr;
  63.     OSErr            err;
  64.     
  65.     aWindow = theToken->tokenWindow;
  66.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  67.     
  68.     if (! aWindow || ! docPtr)
  69.         return(errAENoSuchObject);
  70.  
  71.         // Should do this in prefs
  72.     err = AESetInteractionAllowed(kAEInteractWithAll);
  73.     if (noErr != err) goto done;
  74.     
  75.         //    We do some of the close checks here to avoid
  76.         //    calling AEInteractWithUser
  77.     if ((docPtr->dirty) || (docPtr->everSaved == false)) 
  78.         if (saveOpt != kAENo)    // Don't flip layers if force no ask
  79.             err = AEInteractWithUser(kAEDefaultTimeout, nil, nil);
  80.  
  81.     if (noErr != err) goto done;
  82.         
  83.     err = DoClose(aWindow, true, saveOpt);
  84.  
  85. done:        
  86.     return(err);
  87. }
  88.  
  89.  
  90. OSErr    CloseWindowDesc(AEDesc* windowDesc, DescType saveOpt)
  91. {
  92.     WindowToken        aWindowToken;
  93.     Size            actualSize;
  94.     OSErr            err;
  95.  
  96.     if (typeMyWndw != windowDesc->descriptorType)
  97.         return(errAETypeError);
  98.         
  99.     GetRawDataFromDescriptor(windowDesc, (Ptr)&aWindowToken, sizeof(aWindowToken), &actualSize);
  100.  
  101.     err = CloseWindowToken(&aWindowToken, saveOpt);
  102.     
  103.     return(err);
  104. }
  105.  
  106.  
  107. OSErr    CloseDesc(AEDesc* aDesc, DescType saveOpt)
  108. {
  109.     AEDesc        closeDesc = {typeNull, NULL},
  110.                 windowDesc = {typeNull, NULL},
  111.                 itemDesc = {typeNull, NULL};
  112.     long        itemCount,
  113.                 index;
  114.     DescType    theAEKeyword;
  115.     OSErr        err;
  116.     
  117.     if (typeObjectSpecifier == aDesc->descriptorType)
  118.         err = AEResolve(aDesc, kAEIDoMinimum, &closeDesc);
  119.     else
  120.         err = AEDuplicateDesc(aDesc, &closeDesc);
  121.         
  122.     if (noErr != err) goto done;
  123.     
  124.     switch (closeDesc.descriptorType)
  125.     {
  126.         case typeAEList:
  127.             err = AECountItems(&closeDesc, &itemCount);
  128.             if (noErr != err) goto done;
  129.             
  130.             for (index = 1; index <= itemCount; index++)    // Do front back order
  131.             {
  132.                 err = AEGetNthDesc(&closeDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  133.                 if (noErr != err) goto done;
  134.                 
  135.                 err = CloseDesc(&itemDesc, saveOpt);        // Call recursively
  136.                 if (noErr != err) goto done;
  137.  
  138.                 if (itemDesc.dataHandle)
  139.                     AEDisposeDesc(&itemDesc);
  140.             }
  141.             break;
  142.             
  143.         default:
  144.             err = AECoerceDesc(&closeDesc, typeMyWndw, &windowDesc);
  145.             if (noErr != err) goto done;
  146.             err = CloseWindowDesc(&windowDesc, saveOpt);
  147.     }
  148.     
  149. done:
  150.     if (closeDesc.dataHandle)
  151.         AEDisposeDesc(&closeDesc);
  152.     if (windowDesc.dataHandle)
  153.         AEDisposeDesc(&windowDesc);
  154.     if (itemDesc.dataHandle)
  155.         AEDisposeDesc(&itemDesc);
  156.     
  157.     return(err);
  158. }
  159.  
  160.